import { RouteRecordNormalized, _RouteRecordBase, RouteComponent } from 'vue-router'
import AppFunc, { FuncType, OpenMode } from './entity/AppFunc'

type Lazy<T> = () => Promise<T>

export interface RouteMeta {
    /**
     * 菜单栏及 tagsView 栏、菜单搜索名称（国际化）
     */
    title: string
    /**
     * 是否超链接菜单，开启外链条件，`1、isLink:true 2、链接地址不为空`
     */
    isLink?: string
    /**
     * 是否隐藏此路由
     */
    hidden?: boolean
    /**
     * 是否缓存组件状态
     */
    isCache?: boolean
    /**
     * 是否固定在 tagsView 栏上
     */
    isAffix?: boolean
    /**
     * 是否内嵌窗口，，开启条件，`1、isIframe:true 2、链接地址不为空`
     */
    openMode?: OpenMode
    /**
     * 图标
     */
    icon?: string
    /**
     * 功能类型，和后台对应
     */
    type?: FuncType
    /**
     * 是否包含按钮功能信息，和后台对应
     */
    btns?: AppFunc[]
    /**
     * 路由层级（菜单）
     */
    grade?: number
    /**
     * iframe 内嵌 || 外部打开 的链接地址
     */
    link?: string
    /**
     * 应用功能 id === 路由 id
     * 在后台控制路由时，路由在注册时会被赋予应用功能的 id 作为唯一标识
     * 在配置前台路由时，应尽量与后台应用功能表中的节点 id 对应
     */
    funcId?: string
    /**
     * 路由组件路径
     */
    componentPath?: string
    /**
     * 是否模糊匹配
     */
    isBlurry?: boolean
    /**
     * 配置菜单时的要携带的参数
     */
    urlQuery?: string
    /**
     * 是否隐藏标签
     */
    isHiddenTag?: boolean
    /**
     * 路由是否需要登录
     */
    isNeedLogin?: boolean
    /**
     * 是否是 app 节点
     */
    isApp?: boolean
    /**
     * 是否聚合路由
     */
    isMergeRoute?: boolean
    /**
     * 预留字段
     */
    [k: string]: any
}

export interface RouteConfig {
    path: _RouteRecordBase['path']
    meta: RouteMeta
    name?: _RouteRecordBase['name']
    component?: RouteComponent | Lazy<RouteComponent>
    children?: RouteConfig[]
    redirect?: _RouteRecordBase['redirect']
    alias?: _RouteRecordBase['alias']
    props?: RouteRecordNormalized['props'] | true
    beforeEnter?: _RouteRecordBase['beforeEnter']
}
